#include "circulo.h"
//--------------------------------------------------------------------------------------------/

circulo::circulo(char* IDFigura) : figura(IDFigura){}

//--------------------------------------------------------------------------------------------/

circulo::circulo(textura* tex, color* colorRelleno, color* colorBorde) :	figura(tex,colorRelleno,colorBorde), radio(1){}
//--------------------------------------------------------------------------------------------/

void circulo::setCentro(punto centro)
{
	this->centro = centro;
}
//--------------------------------------------------------------------------------------------/

void circulo::setRadio(float radio)
{
	this->radio = radio;
}
//--------------------------------------------------------------------------------------------/

punto& circulo::getCentro()
{
	return centro;
}
//--------------------------------------------------------------------------------------------/

float circulo::getRadio()
{
	return radio;
}
//--------------------------------------------------------------------------------------------/
void circulo::graficarRellenoCirculo()
{

	SDL_Surface* screen = pantalla::getPantalla();
	int techo,piso,radioVariable,Yentero,radioEntero;;
	color colorFondo;
	SDL_Rect recta;
	if(this->tex == NULL){
		//Uint32 colorRellenoFigura = SDL_MapRGB(screen->format, colorRellenoGrafico.getRojo(),colorRellenoGrafico.getVerde(), colorRellenoGrafico.getAzul());
		Uint32 colorRellenoFigura = SDL_MapRGB(screen->format, colorRellenoGrafico->getRojo(),colorRellenoGrafico->getVerde(), colorRellenoGrafico->getAzul());
		Yentero=(int)centro.getY();
		radioEntero=(int)radio;
		for (techo = -radioEntero, piso = radioEntero; techo<=Yentero+radioEntero; techo++,piso--)
		{
			radioVariable =(int)(sqrt(radioEntero * radioEntero - techo * techo) + 0.5);

			//flecha arriba y derecha
			recta.x =(int)centro.getX()-radioVariable;
			recta.y = Yentero + techo;
			recta.w =radioVariable+radioVariable;
			recta.h = 1;

			//arriba
			SDL_FillRect(screen, &recta, colorRellenoFigura);
			SDL_UpdateRect(screen, recta.x, recta.y, recta.w, recta.h);
		}
	} else {
		graficarCirculoConTextura();
	}
}


//--------------------------------------------------------------------------------------------/

void circulo::algoritmoGraficar()
{

	SDL_Surface* screen = pantalla::getPantalla();
	int posicion, nuevoX, nuevoY,diagonalX, diagonalY, radioEntero;
	int valorX, valorY, contadorCirculo ;
	float maximoX;

	punto unPunto;

	graficarRellenoCirculo();

	valorX=(int)centro.getX();
	valorY=(int)centro.getY();
	radioEntero=(int) radio;

	for (contadorCirculo= 0; contadorCirculo < 50; contadorCirculo++){
		nuevoX = valorX;
		nuevoY = valorY +radioEntero;
		maximoX = valorX+(radioEntero / 1.4142);
		posicion=-radioEntero+1;

		while (nuevoX < maximoX){
			posicion =  ((nuevoX-valorX+1)*(nuevoX-valorX+1))*2;
			posicion =((nuevoY - valorY-1)*(nuevoY- valorY-1))+posicion;
			posicion =  - 2 * radioEntero*radioEntero+ (nuevoY - valorY) * (nuevoY- valorY)+posicion;
			nuevoX = nuevoX + 1;
			
			if (posicion > 0) {
				nuevoY = nuevoY - 1;
			} else {
				nuevoY = nuevoY;
			}

		diagonalX = abs(nuevoX - valorX);
		diagonalY = abs(nuevoY - valorY);
		unPunto.ponerUnPixel(screen, valorX + diagonalY, valorY + diagonalX, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, valorX + diagonalY, valorY - diagonalX, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, valorX - diagonalY, valorY + diagonalX, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, valorX - diagonalY, valorY - diagonalX, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, nuevoX, nuevoY, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, nuevoX, nuevoY - 2 * diagonalY, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, nuevoX - 2 * diagonalX, nuevoY, *(this->colorBordeGrafico));
		unPunto.ponerUnPixel(screen, nuevoX - 2 * diagonalX, nuevoY - 2 * diagonalY, *(this->colorBordeGrafico));
		}
	}
}
//--------------------------------------------------------------------------------------------/

circulo::~circulo() {}
//--------------------------------------------------------------------------------------------/

void circulo::graficarCirculoConTextura ()
{
	int x=(int)centro.getX();
	int y=(int)centro.getY();
	int r = (int)radio;
	color col;
	bitmap* imagen = this->tex->getImagen();
	int w = imagen->getImage()->w;
	int h = imagen->getImage()->h;
	SDL_Surface* screen = pantalla::getPantalla();
	if((w > r*2)&&(h > r*2)){
		if(w <= h){
			w=r*2;
		} else {
			h=r*2;
		}
	} else {
		if(w < 2*r){
			w=2*r;
		}
		if(h < 2*r){
			h=2*r;
		}
	}

	imagen->modificarImagen(w,h);
	SDL_Surface* textura = imagen->getImage();
	for ( int posY = y - r ; posY <= (y + r) ; posY++ )	{
		int dY = abs(y - posY);
		int dX = (int) sqrt ( (double) (r * r - dY * dY) );

		for ( int posX = x - dX ; posX <= (x + dX) ; posX++ ){
			//if ( texture != NULL )
			sdlHelper::getPixel ( textura , posX - x + r , posY - y + r , col );
			sdlHelper::drawPixel ( screen , posX , posY , col);
		}
	}
	sdlHelper::flip(screen);
}

